Apache Commons Collections লাইব্রেরি Java Collections Framework এর উপর ভিত্তি করে অতিরিক্ত এবং উন্নত ডাটা স্ট্রাকচার সরবরাহ করে, যা প্রোগ্রামিংকে আরও কার্যকরী এবং নমনীয় করে তোলে। এর মধ্যে একটি শক্তিশালী এবং কার্যকরী ডাটা স্ট্রাকচার হলো Bidirectional Maps (BidiMap)। এটি এমন একটি ম্যাপ যেখানে আপনি কেবল কী থেকে মান (key-value) রেজলভ করতে পারেন না, বরং মান থেকে কীও (value-key) রেজলভ করতে পারেন।
এছাড়া, Advanced Map Operations এর মাধ্যমে ম্যাপের উপর আরও উন্নত কার্যক্রম এবং অপারেশনগুলো সহজভাবে সম্পাদন করা যায়, যেমন ফিল্টারিং, ট্রান্সফরমেশন, এবং কাস্টম কীবেজ় অপারেশন।
BidiMap এমন একটি ম্যাপ যা আপনাকে দ্বৈত দিক থেকে মান (key-value) এবং কী (value-key) অ্যাক্সেস করার সুবিধা দেয়। এটি একটি দ্বৈত ম্যাপ যেখানে একটি কী থেকে মান এবং একই মান থেকে কী খুঁজে পাওয়া যায়। অর্থাৎ, আপনি যখন একটি BidiMap ব্যবহার করেন, তখন আপনি কেবলমাত্র এক দিক দিয়ে নয়, বরং উল্টো দিক থেকেও মান খুঁজে পাবেন।
BidiMap এর মধ্যে কী এবং মান উভয়ের জন্য আলাদা reverse mapping থাকবে, যা সহজে মানের ভিত্তিতে কী খুঁজে বের করার সুবিধা দেয়।
import org.apache.commons.collections4.map.DualHashBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
// Creating a BidiMap
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Adding key-value pairs
bidiMap.put("Apple", "Fruit");
bidiMap.put("Carrot", "Vegetable");
// Accessing data by key
System.out.println("Apple is a " + bidiMap.get("Apple")); // Output: Apple is a Fruit
// Accessing data by value (reverse mapping)
System.out.println("Fruit is " + bidiMap.getKey("Fruit")); // Output: Fruit is Apple
}
}
আউটপুট:
Apple is a Fruit
Fruit is Apple
এখানে:
DualHashBidiMap
ব্যবহার করে আমরা একটি BidiMap তৈরি করেছি।Apache Commons Collections এর মাধ্যমে আপনি Advanced Map Operations (যেমন filtering, transformation, aggregation) খুব সহজে করতে পারেন। এর মাধ্যমে ম্যাপের মধ্যে উন্নত অপারেশন করতে পারা যায় যা সাধারণ HashMap বা TreeMap এ করা সম্ভব নয়।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Predicate;
import java.util.HashMap;
import java.util.Map;
public class MapFilteringExample {
public static void main(String[] args) {
// Creating a Map
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 2);
map.put("cherry", 7);
// Filtering map by values
Map<String, Integer> filteredMap = MapUtils.predicatedMap(map, new Predicate<String>() {
@Override
public boolean evaluate(String key) {
return map.get(key) > 3; // Filter by value > 3
}
});
System.out.println(filteredMap); // Output: {apple=5, cherry=7}
}
}
আউটপুট:
{apple=5, cherry=7}
এখানে:
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Transformer;
import java.util.HashMap;
import java.util.Map;
public class MapTransformationExample {
public static void main(String[] args) {
// Creating a Map
Map<String, String> map = new HashMap<>();
map.put("apple", "fruit");
map.put("carrot", "vegetable");
// Transforming the map values to uppercase
Map<String, String> transformedMap = MapUtils.transformedMap(map, new Transformer<String, String>() {
@Override
public String transform(String value) {
return value.toUpperCase(); // Transforming value to uppercase
}
});
System.out.println(transformedMap); // Output: {apple=FRUIT, carrot=VEGETABLE}
}
}
আউটপুট:
{apple=FRUIT, carrot=VEGETABLE}
এখানে:
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapAggregationExample {
public static void main(String[] args) {
// Creating a Map
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 2);
map.put("cherry", 7);
// Summing the values of the map
int sum = MapUtils.sum(map);
System.out.println("Sum of all values: " + sum); // Output: Sum of all values: 14
}
}
আউটপুট:
Sum of all values: 14
এখানে:
Operation | Description | Usage |
---|---|---|
BidiMap | Two-way map that allows bidirectional key-value access. | For scenarios where you need reverse lookup. |
Map Filtering | Filter map based on a predicate (condition). | For extracting specific elements based on conditions. |
Map Transformation | Apply transformation to map values or keys. | For transforming map values or keys to new formats. |
Map Aggregation | Perform aggregation operations like sum, average, etc. | For performing statistical operations on map values. |
Apache Commons Collections এর BidiMap এবং Advanced Map Operations শক্তিশালী এবং কার্যকরী ডাটা স্ট্রাকচার সরবরাহ করে যা Java Collections Framework এর সাধারণ ম্যাপের তুলনায় আরও উন্নত কার্যক্ষমতা প্রদান করে। BidiMap আপনাকে একই কী বা মান থেকে উভয় দিকের অ্যাক্সেস প্রদান করে, যখন Advanced Map Operations ম্যাপের উপর ফিল্টারিং, ট্রান্সফরমেশন, এবং অ্যাগ্রিগেশন এর মতো উন্নত অপারেশন করতে সহায়তা করে। এগুলির মাধ্যমে আপনি ডাটা ম্যানিপুলেশন ও ব্যবস্থাপনাকে আরো কার্যকরী এবং নমনীয়ভাবে করতে পারেন।
BidiMap (Bidirectional Map) হল একটি বিশেষ ধরনের Map যা দুইটি দিক থেকে কাজ করতে সক্ষম। অর্থাৎ, এটি একটি key-value সম্পর্কের পাশাপাশি value-key সম্পর্কও ধারণ করে। সাধারণত, Map-এ কেবল key -> value সম্পর্ক থাকে, কিন্তু BidiMap-এ আপনি value -> key সম্পর্কও অ্যাক্সেস করতে পারেন। এটি Apache Commons Collections লাইব্রেরির একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার যা Map-এর ডেটা স্ট্রাকচারের কার্যকারিতা বাড়ায়।
Apache Commons Collections লাইব্রেরিতে দুটি প্রধান BidiMap বাস্তবায়ন রয়েছে:
DualHashBidiMap
: এটি একটি বাস্তবায়ন যা HashMap এবং HashSet এর মতো উপাদান ব্যবহার করে।TreeBidiMap
: এটি একটি বাস্তবায়ন যা TreeMap এর ভিত্তিতে কাজ করে এবং BidiMap এর সমস্ত বৈশিষ্ট্য প্রদান করে, তবে এতে sorted order থাকে।এখানে একটি উদাহরণ দেওয়া হয়েছে যেখানে BidiMap এর কাজ দেখানো হয়েছে:
import org.apache.commons.collections4.map.BidiMap;
import org.apache.commons.collections4.map.DualHashBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
// Create a BidiMap instance
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Add key-value pairs
bidiMap.put("apple", "fruit");
bidiMap.put("carrot", "vegetable");
bidiMap.put("banana", "fruit");
// Access value using key
System.out.println("apple is a " + bidiMap.get("apple")); // Output: apple is a fruit
// Access key using value
System.out.println("The key for value 'fruit' is " + bidiMap.getKey("fruit")); // Output: The key for value 'fruit' is apple
// Check if a specific value exists
System.out.println("Does 'carrot' exist as a key? " + bidiMap.containsKey("carrot")); // Output: true
System.out.println("Does 'vegetable' exist as a value? " + bidiMap.containsValue("vegetable")); // Output: true
}
}
apple is a fruit
The key for value 'fruit' is apple
Does 'carrot' exist as a key? true
Does 'vegetable' exist as a value? true
DualHashBidiMap
ব্যবহার করে একটি BidiMap তৈরি করা হয়েছে।put()
মেথডের মাধ্যমে key-value পেয়ার যোগ করা হয়েছে।get()
মেথডটি key থেকে value রিটার্ন করছে।getKey()
মেথডটি value থেকে key রিটার্ন করছে।containsKey()
এবং containsValue()
মেথডগুলি অনুসন্ধানের জন্য ব্যবহৃত হয়েছে, যা নির্ধারণ করে যে কোনও কী বা মান ম্যাপে আছে কিনা।BidiMap হল Map ডেটা স্ট্রাকচারের একটি শক্তিশালী উন্নত সংস্করণ যা আপনাকে key-value সম্পর্কের পাশাপাশি value-key সম্পর্কও এক্সেস করার সুযোগ দেয়। এটি দুই দিক থেকে ডেটা অনুসন্ধান করার জন্য কার্যকরী এবং বিভিন্ন key-value রিলেশনশিপ ম্যানেজ করার জন্য উপযুক্ত। DualHashBidiMap এবং TreeBidiMap এর মতো বাস্তবায়নগুলি BidiMap এর সুবিধা প্রদান করে, যেখানে আপনি দ্রুত এবং কার্যকরীভাবে bidirectional lookup করতে পারেন।
Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা উন্নত ডেটা স্ট্রাকচার প্রদান করে, এবং এর মধ্যে DualHashBidiMap এবং DualTreeBidiMap দুটি বিশেষ ধরনের BidiMap (Bidirectional Map) ক্লাস। এই দুটি ক্লাস আপনাকে একটি মানচিত্রে কি-to-value এবং value-to-key উভয় দিক থেকে অ্যাক্সেস করতে সক্ষম করে। এরা মূলত two-way mapping প্রদান করে, যেখানে আপনি একটি মান থেকে কী এবং একটি কী থেকে মান খুঁজে পেতে পারেন।
এখানে, আমরা DualHashBidiMap এবং DualTreeBidiMap এর ব্যবহার এবং পার্থক্য নিয়ে আলোচনা করব।
DualHashBidiMap হল একটি BidiMap যা HashMap এর মতো কার্যকরীভাবে কাজ করে এবং কী ও মানের মধ্যে দ্বৈত সংযোগ (bidirectional mapping) তৈরি করে। এটি উভয় দিক থেকে মানের অ্যাক্সেস এবং সঞ্চালন করতে পারে। DualHashBidiMap একটি অর্ডারবিহীন মানচিত্র প্রদান করে, যার মাধ্যমে আপনি কী থেকে মান এবং মান থেকে কী উভয় দিক থেকে অ্যাক্সেস করতে পারবেন।
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
public class DualHashBidiMapExample {
public static void main(String[] args) {
// Create a DualHashBidiMap
BidiMap<String, String> bidiMap = new DualHashBidiMap<>();
// Add key-value pairs
bidiMap.put("A", "Apple");
bidiMap.put("B", "Banana");
// Access value by key
System.out.println("A -> " + bidiMap.get("A")); // Output: Apple
// Access key by value
System.out.println("Apple -> " + bidiMap.getKey("Apple")); // Output: A
}
}
এখানে:
DualTreeBidiMap হল একটি BidiMap যা TreeMap ভিত্তিক এবং এটি কী এবং মান উভয়ের জন্য Sorted Order প্রদান করে। এটি কী ও মানের মধ্যে bidirectional mapping প্রদান করে এবং মানগুলিকে sorted (সাজানো) অবস্থায় রাখে।
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualTreeBidiMap;
public class DualTreeBidiMapExample {
public static void main(String[] args) {
// Create a DualTreeBidiMap
BidiMap<String, String> bidiMap = new DualTreeBidiMap<>();
// Add key-value pairs
bidiMap.put("A", "Apple");
bidiMap.put("B", "Banana");
bidiMap.put("C", "Cherry");
// Access value by key (sorted order)
System.out.println("A -> " + bidiMap.get("A")); // Output: Apple
System.out.println("B -> " + bidiMap.get("B")); // Output: Banana
// Access key by value
System.out.println("Apple -> " + bidiMap.getKey("Apple")); // Output: A
System.out.println("Banana -> " + bidiMap.getKey("Banana")); // Output: B
}
}
এখানে:
পয়েন্ট | DualHashBidiMap | DualTreeBidiMap |
---|---|---|
ভিত্তি | HashMap ভিত্তিক | TreeMap ভিত্তিক |
অর্ডার | অর্ডারবিহীন (unordered) | সাজানো (sorted by key) |
পারফরম্যান্স | দ্রুত অ্যাক্সেস প্রদান করে (এছাড়া অর্ডার থাকে না) | ধীর হতে পারে কারণ এটি কী অনুযায়ী সাজানো থাকে |
উপকারিতা | দ্রুত কীরকম অ্যাক্সেস এবং বড় ডেটা সেটে কার্যকরী | ডেটাকে কী দ্বারা সাজানো (sorted) থাকা প্রয়োজন |
কী-মূল্য সম্পর্ক | উভয় দিকের অ্যাক্সেস (bidirectional) | উভয় দিকের অ্যাক্সেস (bidirectional) |
DualHashBidiMap এবং DualTreeBidiMap উভয়ই BidiMap এর বাস্তবায়ন, তবে তাদের মধ্যে পার্থক্য হলো DualHashBidiMap দ্রুত অ্যাক্সেস এবং অর্ডারবিহীন মানচিত্র সরবরাহ করে, যেখানে DualTreeBidiMap কী এবং মান উভয়কেই সাজানো অবস্থায় (sorted) রাখে। DualHashBidiMap সাধারণত দ্রুততর পারফরম্যান্স প্রদান করে, কিন্তু DualTreeBidiMap সাজানো ডেটা প্রক্রিয়ার জন্য উপযোগী। উভয়ই কী থেকে মান এবং মান থেকে কী এর মধ্যে সম্পর্ক বজায় রাখে এবং ডেটা প্রক্রিয়াতে শক্তিশালী সমাধান প্রদান করে।
Apache Commons Collections লাইব্রেরি Java Collections Framework এর জন্য অতিরিক্ত ডেটা স্ট্রাকচার প্রদান করে। এর মধ্যে দুটি গুরুত্বপূর্ণ Map ইন্টারফেস হল OrderedMap এবং SortedMap, যা কিভাবে ম্যাপের উপাদানগুলির অর্ডার বা শ্রেণীবদ্ধতা (sorting) বজায় রাখতে হবে তা নির্ধারণ করে।
এখানে আলোচনা করা হবে কিভাবে OrderedMap এবং SortedMap ব্যবস্থাপনা করতে হয় এবং Apache Commons Collections এ এই দুটি ইন্টারফেসের কার্যকারিতা কীভাবে ব্যবহৃত হয়।
OrderedMap হল একটি ইন্টারফেস যা Map এর উপাদানগুলির ইনসার্ট অর্ডার বজায় রাখে। এর মানে হল যে, যখন আপনি OrderedMap এ একটি নতুন কী-মান পেয়ার যোগ করবেন, তখন এটি উপাদানগুলির ইনসার্ট অর্ডার অনুযায়ী তাদের সংরক্ষণ করবে।
OrderedMap এর প্রধান বৈশিষ্ট্য:
Apache Commons Collections এ OrderedMap বাস্তবায়ন হিসেবে LinkedMap ব্যবহার করা হয়।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.map.LinkedMap;
import java.util.Map;
public class OrderedMapExample {
public static void main(String[] args) {
// OrderedMap তৈরি করা (LinkedMap)
Map<String, String> orderedMap = new LinkedMap<>();
// উপাদান যোগ করা
orderedMap.put("first", "apple");
orderedMap.put("second", "banana");
orderedMap.put("third", "cherry");
// ইনসার্ট অর্ডারে উপাদান দেখতে
System.out.println("OrderedMap: " + orderedMap);
// keySet() এর মাধ্যমে উপাদান দেখতে
System.out.println("Keys in insertion order: " + orderedMap.keySet());
}
}
আউটপুট:
OrderedMap: {first=apple, second=banana, third=cherry}
Keys in insertion order: [first, second, third]
এখানে:
SortedMap হল একটি ইন্টারফেস যা Map এর উপাদানগুলিকে স্বয়ংক্রিয়ভাবে sort করে রাখে, অথবা এটি উপাদানগুলিকে একটি নির্দিষ্ট ক্রম অনুযায়ী সাজিয়ে রাখে। এটি মূলত Map ইন্টারফেসের একটি বিকল্প যেখানে কীগুলির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে ascending order বা custom comparator এর মাধ্যমে সাজানো হয়।
SortedMap এর প্রধান বৈশিষ্ট্য:
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
public class SortedMapExample {
public static void main(String[] args) {
// SortedMap তৈরি করা (TreeMap)
SortedMap<String, String> sortedMap = new TreeMap<>();
// উপাদান যোগ করা
sortedMap.put("first", "apple");
sortedMap.put("third", "banana");
sortedMap.put("second", "cherry");
// কীগুলিকে সাজানো অবস্থায় দেখতে
System.out.println("SortedMap: " + sortedMap);
}
}
আউটপুট:
SortedMap: {first=apple, second=cherry, third=banana}
এখানে:
firstKey()
: প্রথম কীগুলি রিটার্ন করে।lastKey()
: সর্বশেষ কীগুলি রিটার্ন করে।headMap(K toKey)
: নির্দিষ্ট কীয়ের আগে থাকা উপাদানগুলির সাব-মানচিত্র প্রদান করে।tailMap(K fromKey)
: নির্দিষ্ট কীয়ের পর থাকা উপাদানগুলির সাব-মানচিত্র প্রদান করে।বৈশিষ্ট্য | OrderedMap | SortedMap |
---|---|---|
অর্ডার | ইনসার্ট অর্ডার বজায় রাখে | কীগুলি সাজানো থাকে, সাধারণত ascending order অথবা কাস্টম comparator দিয়ে |
প্রধান বাস্তবায়ন | LinkedMap | TreeMap |
টাস্ক | কীগুলির ইনসার্ট অর্ডার ধরে রাখা | কীগুলিকে সাজানো রাখা |
মেথড | keySet(), entrySet() | firstKey(), lastKey(), headMap(), tailMap() |
অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) লাইব্রেরিতে MapUtils ক্লাস বিভিন্ন ধরণের ম্যাপ (Map) পরিচালনা সহজ করে। এটি সাধারণ Map অপারেশন যেমন ইটারেশন, ডিফল্ট মান সেট করা, বা রিভার্স ম্যাপ তৈরির জন্য উন্নত ফিচার সরবরাহ করে।
Map এর উপর ইটারেশন করা জাভার সাধারণ পদ্ধতি হলেও অ্যাপাচি কমন্সের MapUtils এটি আরও সহজ এবং কার্যকর করে তোলে।
import java.util.HashMap;
import java.util.Map;
public class StandardMapIteration {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
map.put("Orange", 2);
// Key-Value ইটারেট করা
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
MapUtils.verbosePrint() বা MapUtils.debugPrint() এর মাধ্যমে একটি ম্যাপের কনটেন্ট দ্রুত প্রিন্ট করা যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtilsIteration {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
map.put("Orange", 2);
// Map এর কনটেন্ট প্রিন্ট করা
MapUtils.verbosePrint(System.out, "Fruit Counts", map);
}
}
আউটপুট:
Fruit Counts = {3 entries}
Apple = 3
Banana = 5
Orange = 2
কখনো কখনো null
ভ্যালু এড়ানোর জন্য ম্যাপ থেকে ডিফল্ট মান রিটার্ন করার প্রয়োজন হতে পারে।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class DefaultValueExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 3);
map.put("Banana", 5);
// ডিফল্ট মান প্রদান
int orangeCount = MapUtils.getIntValue(map, "Orange", 0);
System.out.println("Orange Count: " + orangeCount); // আউটপুট: 0
}
}
MapUtils.invertMap() ব্যবহার করে একটি ম্যাপের কী এবং ভ্যালু উল্টানো যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class InvertMapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("One", "1");
map.put("Two", "2");
map.put("Three", "3");
// কী এবং ভ্যালু উল্টানো
Map<String, String> reversedMap = MapUtils.invertMap(map);
System.out.println("Reversed Map: " + reversedMap);
}
}
আউটপুট:
Reversed Map: {1=One, 2=Two, 3=Three}
MapUtils.unmodifiableMap() ব্যবহার করে একটি Immutable Map তৈরি করা যায়।
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class UnmodifiableMapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("Key1", "Value1");
map.put("Key2", "Value2");
// Unmodifiable Map তৈরি
Map<String, String> unmodifiableMap = MapUtils.unmodifiableMap(map);
// নতুন মান যোগ করার চেষ্টা
unmodifiableMap.put("Key3", "Value3"); // UnsupportedOperationException থ্রো করবে
}
}
MapUtils.lazyMap() ব্যবহার করে এমন একটি ম্যাপ তৈরি করা যায়, যেখানে নতুন কী ব্যবহার করলে একটি ডিফল্ট মান বা অবজেক্ট স্বয়ংক্রিয়ভাবে তৈরি হয়।
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.Factory;
import java.util.HashMap;
import java.util.Map;
public class LazyMapExample {
public static void main(String[] args) {
Map<String, String> lazyMap = MapUtils.lazyMap(new HashMap<>(), () -> "Default Value");
// নতুন কী-এর জন্য ডিফল্ট মান
System.out.println("Value for Key1: " + lazyMap.get("Key1"));
}
}
আউটপুট:
Value for Key1: Default Value
null
চেক এবং ডিফল্ট মান সেট করার ফিচার আছে।verbosePrint
এবং debugPrint
দ্রুত ডিবাগিং সহায়তা করে।MapUtils হল অ্যাপাচি কমন্স কালেকশনসের একটি শক্তিশালী ইউটিলিটি ক্লাস, যা ম্যাপ পরিচালনার কাজকে সহজ এবং কার্যকর করে তোলে। এটি বিশেষত ডিফল্ট মান প্রদান, Immutable ম্যাপ তৈরি, এবং ম্যাপের ইটারেশন বা প্রিন্টিংয়ের ক্ষেত্রে অত্যন্ত কার্যকর।
common.read_more